#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>   /* gethostbyname() necesita esta cabecera */
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>

#define MAXDATASIZE 100
#define CARAC_IP 15 
#define BACKLOG 10

#define OPR_READ 1
#define OPR_WRITE 2
#define OPR_END 3

int main(int argc, char *argv[])
{
	
	int fd;
	char ip_servidor[CARAC_IP+1];
	int num_puerto_servidor;
	
	struct sockaddr_in servidor;  /* información sobre la dirección del servidor */
	
	char lu[5], nota[2], resp[100];
	int op;
	
	/*RECEPCIÓN DE PARÁMETROS*/	
	if(argc != 7 && argc != 9){
		printf("no se cargaron los suficientes parámetros\n");
		return 1;	
	}
	//ip
	int tam_ip=strlen(argv[2]);
	if(tam_ip < 16 && tam_ip >= 7){
		strcpy(ip_servidor,argv[2]);
	} else { 
		printf("Error en la ip del servidor\n"); 
		return 1;
	}
	
	num_puerto_servidor=atoi(argv[4]);
	
	int tam_lu=strlen(argv[6]);
	if(tam_lu == 5){
		strcpy(lu,argv[6]);
	} else { 
		printf("Error en la libreta, debe ser de 5 digitos\n"); 
		return 1;
	}
	
   if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1){  
      /* llamada a socket() */
      printf("socket() error\n");
      return 0;
   }
	
	memset(&servidor,0,sizeof(struct sockaddr));
  	servidor.sin_family = AF_INET;
  	servidor.sin_port = htons(num_puerto_servidor); 
   
  	inet_aton(ip_servidor, &servidor.sin_addr);
   

   	if(connect(fd, (struct sockaddr *)&servidor,
     		sizeof(struct sockaddr))==-1){ 
		/* llamada a connect() */
		printf("connect() error\n");
		return 0;
	}
	
	// consulta
	if(argc == 7) {
		op = OPR_READ;
		if(write(fd,&op,sizeof(op)) < 0)
			perror("No se pudo comunicar con el servidor");
		write(fd,&lu,sizeof(lu));
		read(fd,resp, sizeof(resp));
		printf("%s\n", resp);
	}
	else { //actualizacion
		strcpy(nota,argv[8]);
		op = OPR_WRITE;
		if(write(fd,&op,sizeof(op)) < 0)
			perror("No se puedo comunicar con el servidor");
		write(fd,&lu,sizeof(lu));
		write(fd,&nota,sizeof(nota));
		read(fd,resp, sizeof(resp));
		printf("%s\n", resp);
	}
	
	op = OPR_END;
	write(fd,&op,sizeof(op));
 
	close(fd);   
	return 0;

}


